#ifdef USBCON
#ifdef USBD_USE_CDC
#include "ch32v_def.h"
#include "usbd_def.h"
#include "usbd_cdc.h"


uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] = {
    0x09,                                   //配置描述符长度，标准USB配置描述符长度为9字节
    USB_DESC_TYPE_CONFIGURATION,            //描述符类型，配置描述符为0x02
    USB_CDC_CONFIG_DESC_SIZ,                //配置描述符集合总长度，67字节
    0x00, 
    0x02,                                   //该配置所支持的接口数，2个接口
    0x01,                                   //表示该配置的值
    0x00,                                   //描述该配置的字符串的索引值，0x00表示没有字符串
    0xC0,                                   //描述设备的一些属性，如供电方式和唤醒等，0xA0表示设备总线供电且支持远程唤醒
    0x32,                                   //设备需要从总线获取的最大电流量，0x32表示最大电流100ma

    /** 以下为接口0（CDC接口）描述符，接口描述符不能单独返回，必须附着在配置描述符后一并返回 */
    0x09,                                   //接口描述符长度，标准的USB接口描述符长度为9字节
    USB_DESC_TYPE_INTERFACE,                //描述符类型，接口描述符为0x04
    0x00,                                   //该接口的编号，从0开始，此处为0x00
    0x00,                                   //该接口的备用编号,通常设置为0
    0x01,                                   //该接口所使用的端点数，0x01表示使用1个端点。如果该字段为0，则表示没有非0端点，只使用默认的控制端点。CDC接口只使用一个中断输入端点
    0x02,                                   //该接口所使用的类，0x02为CDC类
    0x02,                                   //该接口所使用的子类，要实现USB转串口，就必须使用Abstract Control Model（抽象控制模型）子类，它的编号为0x02
    0x01,                                   //该接口所使用的协议，使用Common AT Commands（通用AT命令）协议
    0x00,                                   //该接口的字符串的索引值，0x00表示没有字符串

    /** 功能描述符，主要用来描述接口的功能，功能描述符放在CDC接口（主接口）之后*/
    0x05,                                   //该功能描述符的长度，5个字节
    0x24,                                   //该描述符的类型，固定位0x24（CS_INTERFACE的编码）
    0x00,                                   //该描述符子类型
    0x10,                                   //USB通信设备协议的版本号。此处为USB1.1
    0x01,    

    /** 管理描述符(没有数据类接口)*/
    0x05,                                   //该功能描述符的长度，5个字节
    0x24,                                   //该描述符的类型，固定位0x24（CS_INTERFACE的编码）
    0x01,                                   //该描述符子类型
    0x00,                                   //描述设备的能力，只有最低两位D0和D1有意义，其余位为保留值0。D0为0，表示设备自己不处理调用管理，为1则表示自己处理。
    0x01,                                   //表示选择用来做调用管理的数据类接口编号，由于不使用数据类接口做调用管理，因而该字段设置为0

    /** Abstract Control Management Functional Descriptor  抽象控制管理功能描述符*/
    0x04,                                   //该功能描述符的长度，4个字节
    0x24,                                   //该描述符的类型，固定位0x24（CS_INTERFACE的编码）
    0x02,                                   //该描述符子类型
    0x02,                                   //描述设备的能力，其中D7-4位为保留位，设置为0，支持Set_Line_Coding、Set_Control_Line_State、Get_Line_Coding请求和Serial_State通知
                                        //D0表示是否支持以下请求：Set_Comm_Feature、Clear_Comm_Feature、Get_Comm_Feature,为1表示支持；
                                        //D1位表示是否支持Set_Line_Coding、Set_Control_Line_State、Get_Line_Coding请求和Serial_State通知，为1表示支持
                                        //D2为表示是否支持Send_Break，为1表示支持
                                        //D3表示是否支持Network_Connection通知，为1表示支持

    /** Union Functional Descriptor，
     * 至少5字节，他描述一组接口之间的关系可以被当作为一个功能单元来看待，这些接口一个作为主接口，其他作为从接口
     */
    0x05,                                   //该功能描述符的长度，5个字节
    0x24,                                   //该描述符的类型，固定位0x24（CS_INTERFACE的编码）
    0x06,                                   //该描述符子类型
    0x00,                                   //第四字节为主接口编号，此处为编号为0的CDC接口
    0x01,                                   //第五字节为第一从接口编号，此处为编号1的数据类接口，本例程只有一个从接口

    /** 接口0（CDC接口）的端点描述符*/
    0x07,                                   //端点描述符长度，7字节
    USB_DESC_TYPE_ENDPOINT,                 //描述符类型，端点描述符为0x05
    CDC_CMD_EP,                             //该端点的地址，0x81表示端点1作为输入
    0x03,                                   //该端点的属性。最低两位D1-0表示该端点的传输类型，0为控制传输，1为等时传输，2为批量传输，3为中断传输
    LOBYTE(CDC_CMD_PACKET_SIZE),            //该端点支持的最大包长度，64字节
    HIBYTE(CDC_CMD_PACKET_SIZE),                             
    CDC_FS_BINTERVAL,                       //端点的查询时间

    /** CDC类接口（接口0）是负责管理整个设备的，而真正的串口数据传输是在数据类接口进行的。这里只使用一个数据类接口，编号为1*/
    0x09,                                   //接口描述符长度，9字节
    USB_DESC_TYPE_INTERFACE,                //描述符类型，接口描述符为0x04
    0x01,                                   //该接口的编号，从0开始，此处为0x01
    0x00,                                   //该接口的备用编号
    0x02,                                   //该接口所使用的端点数，该接口要使用一对批量传输端点，因而端点数量为2
    0x0A,                                   //该接口所使用的类，0x0a为CDC数据类
    0x00,                                   //该接口所使用的子类
    0x00,                                   //该接口所使用的协议
    0x00,                                   //该接口的字符串的索引值，0x00表示没有字符串

    //接口1（数据类接口）的端点描述符
    0x07,                                   //端点描述符长度，7字节
    USB_DESC_TYPE_ENDPOINT,                 //描述符类型，端点描述符为0x05
    CDC_OUT_EP,                             //该端点的地址，0x02表示端点2作为输出
    0x02,                                   //该端点的属性。最低两位D1-0表示该端点的传输类型，0为控制传输，1为等时传输，2为批量传输，3为中断传输
    LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),
    HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),    //该端点支持的最大包长度，64字节
    0x00,                                   //端点的查询时间，这里对批量端点无效

    0x07,                                   //端点描述符长度，7字节
    USB_DESC_TYPE_ENDPOINT,                 //描述符类型，端点描述符为0x05
    CDC_IN_EP,                              //该端点的地址，0x82表示端点2作为输入
    0x02,                                   //该端点的属性。最低两位D1-0表示该端点的传输类型，0为控制传输，1为等时传输，2为批量传输，3为中断传输
    LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),
    HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),     //该端点支持的最大包长度，64字节
    0x00,                                    //端点的查询时间，这里对批量端点无效
};

#endif /* USBD_USE_CDC */
#endif /* USBCON */